bitkeeper revision 1.1159.258.138 (428bb692pAqBH2bNfpxOYMXMKwbIsw)
authoriap10@freefall.cl.cam.ac.uk <iap10@freefall.cl.cam.ac.uk>
Wed, 18 May 2005 21:41:38 +0000 (21:41 +0000)
committeriap10@freefall.cl.cam.ac.uk <iap10@freefall.cl.cam.ac.uk>
Wed, 18 May 2005 21:41:38 +0000 (21:41 +0000)
Move magic sysrq from workqueue to softirq context so that its more likely to work if the system is in a bad state.

linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c

index b1bc5e01468c3c9de01f81986c9a82a4a7185da2..9dce9e2abcb39e3df081e6f5966d07974fee9102 100644 (file)
@@ -52,7 +52,6 @@ EXPORT_SYMBOL(machine_power_off);
 
 /* Ignore multiple shutdown requests. */
 static int shutting_down = -1;
-static int pending_sysrq = -1;
 
 static void __do_suspend(void)
 {
@@ -216,24 +215,23 @@ static void __shutdown_handler(void *unused)
     }
 }
 
-static void __sysrq_handler(void *unused)
+static void shutdown_handler(ctrl_msg_t *msg, unsigned long id)
 {
+    static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL);
+
+    if ( msg->subtype == CMSG_SHUTDOWN_SYSRQ )
+    {
+       int sysrq = ((shutdown_sysrq_t *)&msg->msg[0])->key;
+       
 #ifdef CONFIG_MAGIC_SYSRQ
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-    handle_sysrq(pending_sysrq, NULL, NULL);
+       handle_sysrq(sysrq, NULL, NULL);
 #else
-    handle_sysrq(pending_sysrq, NULL, NULL, NULL);
+       handle_sysrq(sysrq, NULL, NULL, NULL);
 #endif
 #endif
-    pending_sysrq = -1;
-}
-
-static void shutdown_handler(ctrl_msg_t *msg, unsigned long id)
-{
-    static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL);
-    static DECLARE_WORK(sysrq_work, __sysrq_handler, NULL);
-
-    if ( (shutting_down == -1) &&
+    }
+    else if ( (shutting_down == -1) &&
          ((msg->subtype == CMSG_SHUTDOWN_POWEROFF) ||
           (msg->subtype == CMSG_SHUTDOWN_REBOOT) ||
           (msg->subtype == CMSG_SHUTDOWN_SUSPEND)) )
@@ -241,12 +239,6 @@ static void shutdown_handler(ctrl_msg_t *msg, unsigned long id)
         shutting_down = msg->subtype;
         schedule_work(&shutdown_work);
     }
-    else if ( (pending_sysrq == -1) && 
-              (msg->subtype == CMSG_SHUTDOWN_SYSRQ) )
-    {
-        pending_sysrq = ((shutdown_sysrq_t *)&msg->msg[0])->key;
-        schedule_work(&sysrq_work);
-    }
     else
     {
         printk("Ignore spurious shutdown request\n");